/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package WebServices;

import DataTypes.DataEvento;
import DataTypes.DataMensaje;
import DataTypes.DataUsuario;
import Hndlr.HndlrUsuario;
import Interfaces.Factory;
import Interfaces.ICtrlUsuarios;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.ParameterStyle;
import javax.jws.soap.SOAPBinding.Style;
import javax.xml.ws.Endpoint;
import DataTypes.DataHistorial;
import objetos.Usuario;

/**
 *
 * @author Sebas
 */
@WebService
@SOAPBinding(style = Style.RPC, parameterStyle = ParameterStyle.WRAPPED)
public class CtrlUsuariosWS {

    private Endpoint endpoint = null;
    private Logger log = Logger.getLogger(CtrlUsuariosWS.class.getName());

    @WebMethod(exclude = true)
    public void publicar() {
        Propiedades propiedades = Propiedades.getInstance();
        String camino = "http://" + propiedades.getServer() + ":" + propiedades.getPuerto() + "/CtrlUsuarios";
        log.info("publicando el endpoint CtrlUsuarios");
        endpoint = Endpoint.publish(camino, this);
        log.info("Endpoint CtrlUsuarios publicado en " + camino);
    }

    @WebMethod(exclude = true)
    public Endpoint getEndpoint() {
        return endpoint;
    }

    @WebMethod
    public void altaUsuario(@WebParam(name = "du") DataUsuario du) {
        ICtrlUsuarios ctrlUsr = Factory.getInstance().getUsuarios();
        try {
            ctrlUsr.altaUsuario(du);
        } catch (IOException ex) {
            Logger.getLogger(CtrlUsuariosWS.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @WebMethod
    public void bloquearUsuario(@WebParam(name = "du") DataUsuario du) {
        ICtrlUsuarios ctrlUsr = Factory.getInstance().getUsuarios();
        try {
            ctrlUsr.bloquearUsuario(du);
        } catch (IOException ex) {
            Logger.getLogger(CtrlUsuariosWS.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @WebMethod
    public DataUsuario[] listaUsuarios() {
        ICtrlUsuarios ctrlUsr = Factory.getInstance().getUsuarios();
        ArrayList<DataUsuario> listarDUsuarios = ctrlUsr.listarDUsuarios();
        Iterator<DataUsuario> it = listarDUsuarios.iterator();
        int tam = listarDUsuarios.size();
        DataUsuario[] datU = new DataUsuario[tam];
        int i = 0;
        while (it.hasNext()) {

            datU[i] = it.next();
            i++;
        }
        return datU;
    }

    @WebMethod
    public boolean containsKey(@WebParam(name = "du") String clave) {
        ICtrlUsuarios ctrlUsr = Factory.getInstance().getUsuarios();
        return (ctrlUsr.containsKey(clave));
    }

    @WebMethod
    public DataUsuario getUsuario(@WebParam(name = "clave") String clave) {
        ICtrlUsuarios ctrlUsr = Factory.getInstance().getUsuarios();
        return (ctrlUsr.getUsuario(clave));
    }

    @WebMethod
    public void ModificarUsuario(@WebParam(name = "du") DataUsuario du, @WebParam(name = "clave") String clave) {
        ICtrlUsuarios ctrlUsr = Factory.getInstance().getUsuarios();
        ctrlUsr.ModificarUsuario(du, clave);
    }

    @WebMethod
    public ArrayList<DataUsuario> listarDUsuarios() {
        ICtrlUsuarios ctrlUsr = Factory.getInstance().getUsuarios();
        return (ctrlUsr.listarDUsuarios());
    }

    @WebMethod
    public void AgregarAmigo(
            @WebParam(name = "claveUsu") String claveUsu,
            @WebParam(name = "amigo") String amigo,
            @WebParam(name = "fecha") Calendar fecha) {
        ICtrlUsuarios ctrlUsr = Factory.getInstance().getUsuarios();
        try {
            ctrlUsr.AgregarAmigo(claveUsu, amigo, fecha);
        } catch (IOException ex) {
            Logger.getLogger(CtrlUsuariosWS.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @WebMethod
    public DataUsuario[] listarDAmigos(@WebParam(name = "ClaveUsu") String ClaveUsu) {

        ICtrlUsuarios ctrlUsr = Factory.getInstance().getUsuarios();
        ArrayList<DataUsuario> listarDAmigos = ctrlUsr.listarDAmigos(ClaveUsu);
        Iterator<DataUsuario> it = listarDAmigos.iterator();
        int tam = listarDAmigos.size();
        DataUsuario[] datU = new DataUsuario[tam];

        int i = 0;
        while (it.hasNext()) {

            datU[i] = it.next();
            i++;
        }

        return datU;
    }

    @WebMethod
    public void quitarAmigo(@WebParam(name = "claveUsu") String claveUsu, @WebParam(name = "amigo") String amigo) {
        ICtrlUsuarios ctrlUsr = Factory.getInstance().getUsuarios();
        try {
            ctrlUsr.quitarAmigo(claveUsu, amigo);
        } catch (IOException ex) {
            Logger.getLogger(CtrlUsuariosWS.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @WebMethod
    public boolean esCreadorGrupo(@WebParam(name = "correo") String correo) {
        ICtrlUsuarios ctrlUsr = Factory.getInstance().getUsuarios();
        return (ctrlUsr.esCreadorGrupo(correo));
    }

    @WebMethod
    public void agregarEvento(@WebParam(name = "even") DataEvento even, @WebParam(name = "usu") String usu) {
        ICtrlUsuarios ctrlUsr = Factory.getInstance().getUsuarios();
        ctrlUsr.agregarEvento(even, usu);
    }

    @WebMethod
    public DataEvento[] listarCalendarioEventos(@WebParam(name = "nomGrup") String nomGrup) {


        HndlrUsuario husu = HndlrUsuario.getInstance();
        HashMap<String, DataEvento> listEve = husu.listarCalendarioEventos(nomGrup);
        int tam = listEve.size();
        DataEvento[] datE = new DataEvento[tam];
        Iterator<DataEvento> it = listEve.values().iterator();
        int i = 0;
        while (it.hasNext()) {

            datE[i] = it.next();
            i++;
        }

        return datE;


    }

    @WebMethod
    public boolean coincidePassUsr(@WebParam(name = "mail") String mail, @WebParam(name = "pass") String pass) {
        ICtrlUsuarios ctrlUsr = Factory.getInstance().getUsuarios();
        return (ctrlUsr.coincidePassUsr(mail, pass));
    }

    @WebMethod
    public boolean yaExisteNick(@WebParam(name = "nick") String nick) {
        ICtrlUsuarios ctrlUsr = Factory.getInstance().getUsuarios();
        return (ctrlUsr.yaExisteNick(nick));
    }

    @WebMethod
    public boolean cambioPassUsr(@WebParam(name = "mail") String mail) {
        ICtrlUsuarios ctrlUsr = Factory.getInstance().getUsuarios();
        return (ctrlUsr.cambioPassUsr(mail));
    }

    @WebMethod
    public boolean sonUsrAmigos(@WebParam(name = "mail1") String mail1, @WebParam(name = "mail2") String mail2) {
        ICtrlUsuarios ctrlUsr = Factory.getInstance().getUsuarios();
        return (ctrlUsr.sonUsrAmigos(mail1, mail2));
    }

    @WebMethod
    public void activarNotificaciones(@WebParam(name = "mailUsr") String mailUsr, @WebParam(name = "activar") boolean activar) {
        ICtrlUsuarios ctrlUsr = Factory.getInstance().getUsuarios();
        ctrlUsr.activarNotificaciones(mailUsr, activar);
    }

    @WebMethod
    public String[] amigosEnComun(@WebParam(name = "participantes") String[] part) {

        String[] p = part;
        ArrayList<String> res = new ArrayList<String>();
        ArrayList<DataUsuario> amigos = getUsuario(p[0]).getUsuariosAmigos();
        int tam = part.length;
        Iterator<DataUsuario> it = amigos.iterator();
        int i = 0;
        while (it.hasNext()) {

            DataUsuario du = it.next();
            boolean esAmigo = true;
            while (tam != 1 && esAmigo) {

                Usuario usu = HndlrUsuario.getInstance().getUsuarioU(p[tam - 1]);
                if (usu.esAmigo(du.getCorreo())) {
                    esAmigo = true;
                } else {
                    esAmigo = false;
                }

                tam--;
            }
            if (esAmigo) {
                res.add(du.getCorreo());
                i++;
            }
            tam = p.length;
        }
        String[] res2 = new String[res.size()];
        int o = 0;
        Iterator<String> itera = res.iterator();
        while (itera.hasNext()) {

            res2[o] = itera.next();
            o++;
        }
        return res2;
    }

    @WebMethod
    public void agegarHistorial(@WebParam(name = "idUsuario") String idUsuario, @WebParam(name = "idAmigo") String idAmigo, @WebParam(name = "mensajes") DataMensaje[] arg) {

        ICtrlUsuarios ctrlUsr = Factory.getInstance().getUsuarios();

        ArrayList<DataMensaje> list = new ArrayList<DataMensaje>();
        int i = arg.length;
        while (i != 0) {

            list.add(arg[i - 1]);
            i--;

        }
        Collections.reverse(list);
        ctrlUsr.agregarHistorial(idUsuario, idAmigo, list);
    }

    @WebMethod
    public DataHistorial getHistorial(@WebParam(name = "usuario") String usu, @WebParam(name = "amigo") String amigo) {

        ICtrlUsuarios ctrlUsr = Factory.getInstance().getUsuarios();
        return ctrlUsr.getHistorial(usu, amigo);

    }

    @WebMethod
    public void agregarSolicitudAmistad(@WebParam(name = "solicitante") String solicitante, @WebParam(name = "solicitado") String solicitado) {
        ICtrlUsuarios ctrlUsr = Factory.getInstance().getUsuarios();
        ctrlUsr.agregarSolicitudAmistad(solicitante, solicitado);
    }

    @WebMethod
    public boolean existeSolicitudUsuario(@WebParam(name = "solicitante") String solicitante, @WebParam(name = "solicitado") String solicitado) {
        ICtrlUsuarios ctrlUsr = Factory.getInstance().getUsuarios();
        return ctrlUsr.existeSolicitudUsuario(solicitante, solicitado);
    }

    @WebMethod
    public void cancelarSolicitud(@WebParam(name = "solicitante") String solicitante, @WebParam(name = "solicitado") String solicitado) {
        ICtrlUsuarios ctrlUsr = Factory.getInstance().getUsuarios();
        ctrlUsr.cancelarSolicitud(solicitante, solicitado);
    }

    @WebMethod
    public void aceptarSolicitud(@WebParam(name = "solicitante") String solicitante, @WebParam(name = "solicitado") String solicitado) {
        ICtrlUsuarios ctrlUsr = Factory.getInstance().getUsuarios();
        ctrlUsr.aceptarSolicitud(solicitante, solicitado);
    }

    @WebMethod
    public DataUsuario[] listarSolicitudes(@WebParam(name = "mailUsr") String mailUsr) {
        ArrayList<DataUsuario> listUsr = Factory.getInstance().getUsuarios().listarSolicitudes(mailUsr);
        int tam = listUsr.size();
        DataUsuario listResult[] = new DataUsuario[tam];
        int i = 0;
        Iterator<DataUsuario> itera = listUsr.iterator();
        DataUsuario usr = null;
        while (itera.hasNext()) {
            usr = itera.next();
            listResult[i] = usr;
            i++;
        }
        return listResult;
    }

    @WebMethod
    public int promedioPuntajeUsr(@WebParam(name = "mailUsr") String mailUsr) {
        ICtrlUsuarios ctrl = Factory.getInstance().getUsuarios();
        return ctrl.promedioPuntajeUsr(mailUsr);
        
    }
    
    @WebMethod
    public DataUsuario[] listarSugerenciaAmigos(@WebParam(name = "mailUsr")String mailUsr){
        ICtrlUsuarios ctrl = Factory.getInstance().getUsuarios();
        ArrayList<DataUsuario> listaUsr = ctrl.listarSugerenciaAmigos(mailUsr);
        int tam = listaUsr.size();
        DataUsuario lista[] = new DataUsuario[tam];
        int i = 0;
        Iterator<DataUsuario> itera = listaUsr.iterator();
        while (itera.hasNext()){
            lista[i] = itera.next();
            i++;
        }
        return lista;
    }
}
